浏览器缓存
浏览器缓存分为几个阶段:
浏览器缓存阶段
一.强制缓存阶段
1.cache-control
: 决定了浏览器端和服务器端缓存的策略,可以出现在响应头response header中,或者 请求头 request header中
max-age
:指定缓存的最大有效时间,eg:cache-control:max-age=315360000
,注意与expires
做区分(与cache-control
平级),单位是s,max-age
优先级高于expires
,这个属性时HTTP1.1中新增的属性s-maxage
:指定public
的缓存,缓存设备有很多,不仅仅浏览器是缓存设备,在整个网络中,可能会存在代理服务器,CDN
属于public
缓存设备,因为可以多用户访问并读取信息;什么是private缓存呢,指的是只是你个人访问的设备,浏览器就属于private缓存设备,eg:s-maxage=31536000;他的优先级高于max-age,只能设定public的缓存设备private
:表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)。私有缓存可以缓存响应内容,比如:对应用户的本地浏览器。public
:public指令表明响应可以被任何中间人缓存,即使是通常不可缓存的内容。no-cache
:错误理解:不使用缓存;no-cache指的是不管本地是否设置了max-age(即忽略本地浏览器端的缓存策略),都要向服务器端发送请求,由服务器端来判断缓存情况;如果设置了no-cache,表示每次请求,缓存会将此请求发到服务器验证是否过期,若未过期,则缓存才使用本地缓存副本。no-store
:完全不使用任何的缓存策略,不管是服务器端还是浏览器端的must-revalidate
: 表示缓存过期后必须重新向服务器验证
2.expires:Thu, 14 Mar 2019 17:29:17 GMT
,这个属性时HTTP1.0
中配置,
- 缓存过期时间,用来指定资源到期时间,是服务器端具体的时间点。
- 告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。
二.协商缓存阶段
基于客户端和服务器端的协商缓存机制
1.last-modified
last-modified
- response headerif-modified-since
- request header
需要与cache-control共同使用,如果配置了max-age
且没有过期,就不会使用last-modified;过期了之后,才会使用last-modified。
last-modified
缺点:
- 服务器端不能精确获取 文件变更时间时
- 文件修改时间改了,文件内容没有变
- 以秒为单位,如果是ms内修改了文件,就体现不出来
2.ETag
文档内容的hash值
ETag ---- response header
if-None-Match ----request header
etag
优先级高于last-modified
状态码解析
200(from cache)
: 浏览器端缓存,cache-control:max-age=315360000
或者expires
起作用304
: 服务器端缓存,last-modified
或者etag
起作用- 200:浏览器端没有缓存,或者服务器端缓存失效,或者用户点击了ctrl+F5 浏览器直接从服务器端下载最新的数据
注意:Chrome浏览器,手动点击刷新按钮都会 在请求头中,添加 chche-control:max-age=0
或者cache-control:no-cache
,这样就肯定不会使用浏览器端的缓存!
更加详细,请参考:缓存详解
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。